// Bellman-Ford + SPFA优化模版（洛谷）
// 给定一个 n个点的有向图，请求出图中是否存在从顶点 1 出发能到达的负环
// 负环的定义是：一条边权之和为负数的回路。
// 测试链接 : https://www.luogu.com.cn/problem/P3385
// 提交以下所有代码，可以直接通过

#include <cstdio>
#include <algorithm>

using namespace std;

const int MAXN = 2001;
const int MAXM = 6001;

// 链式前向星建图需要
int head[MAXN];
int next[MAXM];
int to[MAXM];
int weight[MAXM];
int cnt;

// SPFA 需要
const int MAXQ = 4000001;

// 源点出发到每个节点的距离表
int dist[MAXN];

// 节点被松弛的次数
int updateCnt[MAXN];

// 哪些节点被松弛了放入队列
int q[MAXQ];

int l, r;
const int INF = 0x3f3f3f3f;

// 节点是否已经在队列中
bool enter[MAXN];

void build(int n)
{
    cnt = 1;
    l = r = 0;
    fill(head + 1, head + n + 1, 0);
    fill(enter + 1, enter + n + 1, false);
    fill(dist + 1, dist + n + 1, INF);
    fill(updateCnt + 1, updateCnt + n + 1, 0);
}

void addEdge(int u, int v, int w)
{
    ::next[cnt] = head[u];
    to[cnt] = v;
    weight[cnt] = w;
    head[u] = cnt++;
}

// Bellman-Ford + SPFA 优化的模版
bool spfa(int start, int n)
{
    dist[start] = 0;
    ++updateCnt[start];
    q[r++] = start;
    enter[start] = true;
    while(l < r)
    {
        int u = q[l++];
        // 从队列弹出的节点需要置为 false
        enter[u] = false;
        for(int ei = head[u]; ei > 0; ei = ::next[ei])
        {
            int v = to[ei], w = weight[ei];
            if(dist[u] + w < dist[v])
            {
                dist[v] = dist[u] + w;
                // 进入过队列的节点，就不需要重复进队列了
                if(!enter[v])
                {
                    // 节点的更新次数等于 n 了，则说明从 start 出发能到达负环
                    if(updateCnt[v]++ == n) return true;
                    q[r++] = v;
                    enter[v] = true;
                }
            }
        }
    }
    return false;
}

int main()
{
    int cases;
    scanf("%d", &cases);
    int n, m;
    for(int i = 0; i < cases; ++i)
    {
        scanf("%d%d", &n, &m);        
        build(n);
        int u, v, w;
        for(int i = 0; i < m; ++i)
        {
            
            scanf("%d%d%d", &u, &v, &w);
            if(w >= 0)
            {
                addEdge(u, v, w);
                addEdge(v, u, w);
            }
            else
                addEdge(u, v, w);
        }

        if(spfa(1, n)) printf("YES\n");
        else printf("NO\n");
    }

    return 0;
}